package cn.arnold.test;

// 双重校验锁实现单例模式

/**
 * 把构造方法声明为Private。确保只能由自己创建，避免外部创建实例或者被子类继承从而创造额外实例；
 * 定义一个私有静态的该类的实例作为该类的数据域。确保一个类只能有一个实例；
 * 定义一个静态 工厂方法。外部类不能实例化一个该类的对象，所以只能用Static 的方法，提供给其他类调用，返回此单例类唯一的实例。
 */
public class Singleton {
    // 定义一个私有静态的该类的实例作为该类的数据域。确保一个类只能有一个实例
    private volatile static Singleton uniqueInstance;

    // 把构造方法声明为Private。确保只能由自己创建，避免外部创建实例或者被子类继承从而创造额外实例
    private Singleton(){}

    // 定义一个静态工厂方法。外部类不能实例化一个该类的对象，所以只能用Static 的方法，提供给其他类调用，返回此单例类唯一的实例。
    public static Singleton getUniqueInstance(){
        if (uniqueInstance==null){
            // 类对象加锁
            synchronized (Singleton.class){
                if (uniqueInstance==null){
                    uniqueInstance=new Singleton();
                }
            }
        }
        return uniqueInstance;
    }
}
